package com.itheima._05序列化;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/**
    目标：序列化和反序列化。

    对象序列化：把对象的数据存储到磁盘文件中去。
    反序列化：可以把磁盘文件中的对象数据恢复成Java对象。

    开发中，对象数据有时候需要暂时存储起来。
    对象序列化要使用：ObjectOutputStream(对象字节输出流):把对象存储到文件中去。
          Java对象  => 磁盘文件
          创建对象：-- public ObjectOutputStream(OutputStream out)
          序列化对象的方法：-- public final void writeObject(Object obj)
          注意：序列化的对象必须实现序列化接口Serializable(存储对象的规则，sun公司规定的)
             建议给对象申明版本号。
             transient修饰的成员变量将不参与序列化！！

    对象序反列化要使用：ObjectInputStream(对象字节输入流):把磁盘文件数据存储到Java对象中返回。
          磁盘文件   => Java对象
          反序列化方法： public final Object readObject()

            字节流                                                    字符流
     字节输入流                字节输出流                    字符输入流           字符输出流
     InputStream             OutputStream                  Reader              Writer           (抽象类，只是类型)
     FileInputStream         FileOutputStream              FileReader          FileWriter       (实现类，真正使用的管道)
     BufferedInputStream     BufferedOutputStream          BufferedReader      BufferedWriter   (实现类，高级缓冲流)
                                                           InputStreamReader   OutputStreamWriter
     ObjectInputStream       ObjectOutputStream
 */
public class ObjectSerializeDemo02 {
    public static void main(String[] args) throws Exception {
        // 1.定义一个对象字节输入流管道与源文件接通
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("src/obj.dat"));
        // 2.开始反序列化
        User u = (User) ois.readObject();

        System.out.println(u);
    }
}
